문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 쓰레기 수집 (문단 편집) === 참조 횟수 카운팅 기반 쓰레기 수집 === Reference Counting based garbage collection. 다른 메모리가 어떤 메모리를 얼마나 많이 참조하는지 횟수를 세어서 접근 가능과 불가능을 나누는 방식이다. 이 방식에 따르면, 한 메모리에서 다른 메모리를 참조하면 그 다른 메모리의 참조 횟수에 1을 더하고 참조를 중단하면 참조 횟수에 1을 뺀다. 만약 1을 뺀 경우 참조 횟수가 0이 되면 해당 메모리에 아무도 접근을 못 하는 것이므로 해당 메모리를 해제하는 방식이다. 위 설명을 보면 알겠지만 구현이 매우 간단한 편이다. 그러다보니 C에 구현한 구현체도 많이 찾아볼 수 있으며, C++에서는 {{{std::shared_ptr}}}라는 템플릿 클래스로 제공해준다. 또한 '''접근 불가능하게 되자마자 소멸된다'''는 장점도 있다. 추적 기반 GC의 경우 실제로 접근 불가능해지는 시점과 접근 불가능하다는 것을 알아내는 시점이 상당히 떨어져 있는데, 참조 횟수 카운팅 방식에서는 접근이 불가능해지자마자 바로 소멸에 들어가게 된다. 그러다보니 소멸자를 구현할 수 있는 [[C++]]이나 [[Python]] 같은 언어에서 종종 채택된다. 다만 이 방식에는 심각한 문제점이 존재하는데, 하나는 오버헤드고, 나머지 하나는 순환 참조다. 위 설명대로 할 경우 모든 대입문에 참조 횟수를 변경하도록 작성해야 하는데, 이게 생각보다 프로그램을 많이 느리게 만든다. 특히 횟수를 올리는 부분보다는 횟수를 내리는 부분에서 정수 감소, 조건문, 함수 호출 등이 실행될 수 있어서 대입이 빈번히 일어나는 곳에서는 배보다 배꼽이 커질 수 있다. 그 외에도 참조 횟수를 저장함으로 인해 캐시효율이 낮아질 수도 있다. 또한 순환 참조(Cyclic Reference)라는 문제가 있다. 예를 들어서 A에서 B를 가리키고 B에서 A를 가리키면 모두 참조 횟수는 1일 것이다. 그런데 A나 B에 접근할 수 없는데 둘 다 참조 횟수가 0이 아니라서 해제할 수가 없으며 그대로 [[메모리 누수]]가 된다. 그렇다고 카운팅을 안 하는 참조를 제공하면 해제된 메모리를 참조할 수 있다는 문제가 생기다보니, [[C++]], [[PHP]], [[Swift]] 등의 언어에서는 기존의 참조를 강한 참조(strong reference)라고 하고 약한 참조(weak reference)라는 개념을 만들어서 둘을 구분한다. 이 경우, 메모리는 강한 참조와 약한 참조 횟수가 모두 0이 될 때까지 존재하지만, 강한 참조가 0이 되면 해당 메모리에서 다른 메모리로의 참조를 제거한다. 다만 이 방법에서는 weak/strong을 신경써야 하다보니 Tracing GC만큼 편하지 않으며, 오버헤드가 더 커지게 된다. 반대로 아예 순환 참조를 해결하기 위해서 위의 Tracing GC 같은 추적 기법을 도입하기도 한다. [[Python]]과 [[Perl]], [[Kotlin|Kotlin/Native]]가 대표적인 예시로 GC 사이클 검사를 따로 한다. --물론 C++ 같은 언어에서 이런 짓을 했다가는 당장 컴파일 타임이든 런타임이든 성능이 아작날 것이다-- 현재는 [[PHP]]와 [[Swift]] 언어에서 주 쓰레기 수집 기법으로 이 방식을 채택하고 있으며, [[C++]]이라든가 [[Rust(프로그래밍 언어)|Rust]] 같은 언어들은 선택적으로 사용할 수 있게 해당 기능을 제공하고 있다.[* [[안드로이드(운영체제)|안드로이드 프레임워크]]의 C++ 부분이 이 방법을 쓰고 있다. 'RefBase'라는 클래스가 참조 카운팅 기능을 제공하고 다른 모든 클래스는 이를 상속받도록 설계되어 있다.][* [[Cocos2d-x]]라는 2D 게임 엔진에도 Ref라는 클래스가 참조 카운팅 기능을 구현하고 모든 게임 오브젝트 클래스는 이를 상속받도록 설계되어 있다. 여러가지 재미있는 최적화를 통해 오버헤드가 매우 적다!] [[C(프로그래밍 언어)|C]]에서도 [[GNOME|GObject]] 등 참조 횟수 카운팅을 지원하는 라이브러리가 존재한다. 사실 이 방식은 파일 시스템에서 흔하게 사용된다. {{{inode}}}가 그 예시로 연결 숫자가 0이 되면 파일이 사라진다는 점이다. 참조도 어떤 대상체와 이어짐을 의미하니 그 의미가 서로 통하는 부분이 있다. 파일 시스템이 느려져야 할 이유는 없지만 보통 입출력 대기시간이 더 길기 때문에 오버헤드는 큰 문제가 아니기에 널리 사용된다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기